package de.codecentric.ebss.controller; import java.math.BigDecimal; import java.util.Collection; import java.util.Locale; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.support.GenericMessage; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import de.codecentric.ebss.kafka.OrderEntryProducerConfiguration; import de.codecentric.ebss.model.Address; import de.codecentric.ebss.model.Movie; import de.codecentric.ebss.model.Order; import de.codecentric.ebss.model.Recipient; import de.codecentric.ebss.service.MovieService; @RequestMapping("/movies") public class MoviesController { private Log log = LogFactory.getLog(getClass()); private MovieService movieService; @Autowired @Qualifier(OrderEntryProducerConfiguration.OUTBOUND_ID + ".input") private MessageChannel messageChannel; public MoviesController(MovieService movieService, IntegrationFlow flow) { this.movieService = movieService; } @RequestMapping(method = RequestMethod.GET) public String getMovies(Model model, @RequestParam(required = false) String searchString) { log.info("getMovies with searchString " + searchString); Collection<Movie> movies = movieService.findMovies(searchString); model.addAttribute("movies", movies); model.addAttribute("searchString", searchString); return "movies"; } @RequestMapping(value = "{id}", method = RequestMethod.GET) public String getMovieDetails(@PathVariable UUID id, Model model) { log.info("getMovieDetails with id " + id); model.addAttribute("movie", movieService.getMovieById(id)); return "movieDetails"; } @RequestMapping(value = "{id}/order", method = RequestMethod.GET) public String orderMovie(@PathVariable UUID id, Model model) { log.info("orderMovie with id " + id); Movie movie = movieService.getMovieById(id); // Create some default shipping details Address address = new Address(Locale.GERMANY.getDisplayCountry(), "Cologne", "50667", "Domkloster", "4"); Recipient recipient = new Recipient("Alexander", "Mustermann", address, address); Integer amount = ThreadLocalRandom.current().nextInt(1, 15); Order order = new Order(amount, movie.getId().toString(), recipient); BigDecimal totalPrice = movie.getPrice().multiply(BigDecimal.valueOf(amount)); model.addAttribute("movie", movie); model.addAttribute("order", order); model.addAttribute("totalPrice", totalPrice); ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); try { String orderAsJson = ow.writeValueAsString(order); messageChannel.send(new GenericMessage<String>(orderAsJson)); } catch (JsonProcessingException e) { e.printStackTrace(); } return "order"; } }